/**
 * 辅助指令解码
 * User: Zhikang.Peng
 * Date: 2018/06/17 10:18
 */
package base

import (
	"gitee.com/thghh/jvmgo/rtda"
	"gitee.com/thghh/jvmgo/rtda/heap"
)

// 类的初始化
func InitClass(thread *rtda.Thread, class *heap.Class) {
	class.StartInit()
	scheduleClinit(thread, class)
	initSuperClass(thread, class)
}

// 执行类的初始化方法
func scheduleClinit(thread *rtda.Thread, class *heap.Class) {
	clinit := class.GetClinitMethod()
	if clinit != nil {
		newFrame := thread.NewFrame(clinit)
		thread.PushFrame(newFrame)
	}
}

/**
如果超类的初始化还没有开始，就递归调用InitClass（）函数执行超类的初始化方法，
这样可以保证超类的初始化方法对应的帧在子类上面，使超类初始化方法先于子类执行。
*/
func initSuperClass(thread *rtda.Thread, class *heap.Class) {
	if !class.IsInterface() {
		superClass := class.SuperClass()
		// 有超类并且没有初始化
		if superClass != nil && !superClass.InitStarted() {
			InitClass(thread, superClass)
		}
	}
}
